portmaster--无需外部数据库或语言即可管理您的ports
Common Flags: [ --force-config -CGHKdgntvw -[B|b] -[f|i]] [[[--packages|-P]|[--packages-only|-PP]] | [--packages-build]] [ --packages-if-newer] [ --delete-build-only] [ --always-fetch] [ --backup-format=<fmt>] [ --package-format=<fmt>] [ --local-packagedir=<path>] [ --packages-local] [ --delete-packages] [ --no-confirm] [ --no-term-title] [ --no-index-fetch] [--index|--index-first|--index-only] [ -m arguments for make] [ -x glob pattern to exclude from building] [ --try-broken] portmaster [Common Flags] full name of port directory in /var/db/pkg portmaster [Common Flags] full path to /usr/ports/foo/bar portmaster [Common Flags] glob pattern of directories from /var/db/pkg portmaster [Common Flags] [ -U|--update-if-newer] Multiple full names or paths from /usr/ports or /var/db/pkg, and/or multiple globs from /var/db/pkg portmaster [Common Flags] . (Use in /usr/ports/foo/bar to build that port) portmaster [Common Flags] -a portmaster --show-work [ -Gv] [ -m args] <single port, as above> portmaster [Common Flags] -o <new port dir in /usr/ports> <installed port> portmaster [Common Flags] [ -R] -r name/glob of port in /var/db/pkg (can be specified more than once) portmaster -l portmaster [--index-only [-t]] -L portmaster --list-origins portmaster [ --force-config|-G] [ -P|-PP] [ -aftv] -F portmaster [ -n|y] [ -b] [ -D|d|--prompt-clean-distfiles] -e name/glob of a single port directory in /var/db/pkg portmaster [ -n|y] [ -b] [ -D|d|--prompt-clean-distfiles] -s portmaster [ -n|y] [ -t] --clean-distfiles portmaster [ -n|y] [ --index|-index-only] --clean-packages portmaster [ -n|y] [ --index|-index-only] [ -v] --check-depends portmaster [ -n|y] [ -v] --check-port-dbdir portmaster -h|--help portmaster --version
上面提到的“glob”模式不是正则表达式。例如:
“portmaster perl”将匹配 /var/db/pkg 中符合 /var/db/pkg/perl*
模式的每个port目录名。
本手册包含了很多关于 portmaster
的宝贵信息,您应该阅读整个手册,以便更好地了解它的工作原理以及您可以选择的选项。但是,为了让您快速入门,请参阅手册末尾的EXAMPLES部分。
portmaster
实用程序是一个用于更新ports的工具。它不使用外部数据库来跟踪您安装的内容。相反,它使用现有的ports基础设施(infrastructure),包括位于 /var/db/pkg 中的基础设施。此工具的重点是保持ports的依赖性跟踪信息最新。这允许您安全地更新特定ports,而无需更新其“上方”的所有端口。在极少数情况下,您确实需要重新编译依赖于您正在更新的ports的ports,可以使用 -r
选项来实现这一点。
默认情况下, portmaster
会更新您在命令行上指定的port。无论是否有新版本,都会发生这种情况。它将首先遍历port及其所有依赖项(如果有的话),通过“make config”接口处理任何port选项。如果您以前从未构建过port,或者 OPTIONS
发生了变化,您将看到一个 OPTIONS
对话框。您可以使用 --force-config
选项为所有ports强制对话框。
在递归依赖关系时,如果您没有使用任何 --packages*
选项,则将在后台启动 make checksum
过程,以验证是否有正确的distfile可用或开始下载新的distfile。如果您使用 ctrl-c 停止 portmaster
,将尝试杀死为此目的启动的子进程。
在检查依赖关系时,如果ports设置了 CONFLICTS
(冲突),它们将与您安装的ports进行比较,如果您已经拥有正在构建的ports所需的依赖关系的替代版本,则将使用它来代替默认依赖关系。
当配置和依赖性检查阶段结束时,将向用户显示将要安装和/或升级的ports列表,并要求用户在继续之前批准。这种行为可以通过 --no-confirm
选项来抑制。
如果依赖性检查没有找到需要更新的port,则在构建命令行上指定的port之前,将跳过该步骤。除了这种优化之外,有关最新依赖关系的信息、为交互模式构建哪些ports的选择以及为 make config
已经访问的ports都会被缓存,以提高性能并防止重复工作。
在遍历依赖关系时,如果port标记为 IS_ INTERACTIVE
,则将标记此port。在没有此通知的情况下,在正常情况下,port开始构建后不需要用户交互。如果使用 --prompt-clean-distfiles
,则在构建port之后,将出现一个关于删除过时distfiles的问题。 -d
选项可用于在每次成功升级port后删除过时的distfiles。 -D
选项用于禁止删除过时的distfiles,现在已成为默认选项。有许多 --packages*
选项可以节省通常用于构建port的时间。对安装速度和最大性能之间的合理平衡感兴趣的用户应该考虑使用 --packages-build
选项,也许可以与 --delete-build-only
选项结合使用。
如果在更新现有port时没有指定 -B
选项,则将在调用 pkg-delete(8)
之前创建备份包。如果您使用的是 -b
选项,则可以在 PACKAGES
环境变量指定的目录(通常是 /usr/ports/packages)中名为 portmaster-backup 的目录中找到这些包。如果没有指定 -b
选项,则一旦成功安装了新版本的port,备份包将被删除。如果安装因任何原因失败,将打印一条有用的消息,以及在哪里找到备份包的说明。
构建port后,如果使用了 -w
选项,则旧port安装的所有共享库(如果有的话)都将保存到 /usr/local/lib/compat/pkg 。安装后,如果有任何新文件与 /usr/local/lib/compat/pkg 中的文件同名,则旧文件将被删除,ldconfig(8)
将通过 /etc/rc.d/ldconfig 运行。
在构建新port之后,但在安装之前,将检查运行时依赖关系,以确保它们是最新的。如果使用 -g
选项,将为新版本(或新安装的版本)创建一个包。
安装port或使用 --check-depends
选项时,如果有其他port依赖于此port,则依赖port +CONTENTS 文件和新port的 +REQUIRED_BY 文件将被更新。
成功安装后,将显示已安装的任何 pkg-message
文件以及所执行工作的摘要。如果使用了 --delete-build-only
选项,则将删除在当前运行 portmaster
AND期间安装的、在此运行期间仅被列为构建依赖项的包。
如果在此过程中出现问题(例如,port构建失败,port标记为 BROKEN
),portmaster
将报告如上所述成功完成的任何工作,然后退出。
人们经常问这样一个问题:“为什么不可能继续使用没有错误的port?”答案是(不幸的是) portmaster
不是无所不知的,无法猜测用户希望对这个问题有什么解决方案。因此,需要人工干预。
选项如下:
--force-config
对所有ports运行 make config
(覆盖 -G
)
-C
防止在建造前进行 make clean
-G
阻止 make config
-H
在日志文件中隐藏端口构建和安装的详细信息
-K
防止 make clean
在建造后运行
-B
阻止为已安装的port创建备份包
-b
创建并保存已安装port的备份包
-g
创建新port的包
-n
运行所有步骤,但不要创建或安装任何ports
-t
使用所有依赖列表彻底递归依赖关系。建议仅在需要时使用,而不是常规使用。当应用于 --clean-distfiles
选项时,如果distfile与任何最新port匹配,而不仅仅是与已安装的port匹配,则允许保留distfile。
-v
详细输出
-w
卸载前保存旧的共享库
[R] -f
始终重建ports(覆盖 -i
)
-i
交互式更新模式--询问是否重建ports
-D
不清理distfiles(这已成为默认行为)
-d
始终清理distfiles
-m arguments for make
提供给 make(1)
的参数
-x
避免构建或更新与此模式匹配的ports。可以指定多次。如果尚未安装port,则将对 /usr/ports 中的目录名运行排除模式。
--no-confirm
在继续之前,不要要求用户确认要安装和/或更新的ports列表
--no-term-title
不更新xterm标题栏
--no-index-fetch
跳过获取 INDEX 文件
--index
仅使用 INDEX 文件检查port是否为最新
--index-first
使用 INDEX 表示状态,但要仔细检查(double-check)port
--index-only
不要尝试使用 /usr/ports 。当没有 /usr/ports 目录时,需要使用 -PP|--packages-only
选项来更新ports。有关其他要求,请参阅下面的 【ENVIRONMENT】(环境)部分。
--delete-build-only
在成功运行后删除仅构建依赖项的ports,前提是此运行已安装
-U|--update-if-newer
(仅适用于命令行上列出的多个ports)如果安装的版本是最新的,则不重建/重新安装
-P|--packages
使用包,但如果port不可用,则构建port(use packages, but build port if not available)
-PP|--packages-only
如果没有可用的包,则失败。 -PP
选项必须独立于命令行。换句话说,你不能做 -PPAv
(例如)。
--packages-build
对所有构建依赖项使用包
--packages-if-newer
如果软件包比安装的软件包更新,则使用该软件包,即使根据ports树该软件包不是最新的
--always-fetch
获取包,即使它在本地已经存在
--package-format=<fmt>
用于从新构建的ports创建的包的存档格式,而不是默认的 txz ,对于大型包来说,txz 可能需要很长时间。支持的格式有:tar、tgz、tbz 和 txz(从最快到最慢)。
--backup-format=<fmt>
用于备份包的存档格式(在删除升级包之前创建),而不是默认的 txz,对于大型包,txz 可能需要很长时间。支持的格式有:tar、tgz、tbz 和 txz(从最快到最慢)。
--local-packagedir=<path>
如果不存在本地版本,则可以在哪里找到本地包将退回到获取。此选项应指向以 make package
(或 portmaster −g
选项)创建方式创建的目录结构的完整路径。即,包文件包含在 <path>/All 中,<path>/LATEST 目录中有 LATEST_LINK
符号链接,类别子目录中 <path>/All 中包的符号链接,如 <path>/devel、<path>/ports-mgmt 等。
--packages-local
仅使用来自 --local-packagedir
的包
--delete-packages
从软件包安装后,将其删除
-a
检查所有ports,必要时进行更新
--show-work
显示哪些依赖ports已安装、哪些未安装(表示 −t
)。
--try-broken
不要跳过标记为 BROKEN
或 IGNORED
的端口,并使用 -DTRYBROKEN
调用 make
命令。
-o <new port dir in /usr/ports> <installed port>
用其他来源的port替换已安装的port
[-R] -r name/glob of port directory in /var/db/pkg
重建指定的port以及依赖它的所有ports。依赖port的列表是根据来源(即 category/portname)而不是安装port的版本号构建的。因此,如果您执行 portmaster −r fooport-1.23
,并且有必要使用 −r
重新启动,但新安装的port现在是 fooport-1.24
,您可以执行 portmaster –R −r fooport-1.24
,它应该从您停止的地方开始。可以多次指定 −r
选项。
-R
与 -r
或 -f
选项一起使用,以跳过上次运行时更新的ports。当与 -r
一起使用时,如果父port及其所有依赖项都是最新的,它也会阻止父port的重建。
-l
按类别列出所有已安装的ports
-L
按类别列出所有已安装的ports,并搜索更新
--list-origins
从 /usr/ports 中列出根port和叶ports的目录。此列表适用于在另一台机器上馈送给 portmaster
或重新安装所有ports。请参阅下面的【EXAMPLES】。
[--force-config|-G] [-aftv] -F
仅获取distfiles
-n
对以下功能的所有用户提示回答 no
-y
对以下功能的所有用户提示回答 yes
[-n|-y] [-b] [-d|-prompt-clean-distfiles] -e name/glob of a single port directory in /var/db/pkg
使用 pkg(8) delete
删除port,并可选择删除所有distfiles。完成删除后调用 -s
,以防删除port导致不再需要依赖关系。
[-n|-y] [-b] [-D|-d|--prompt-clean-distfiles] -s
清理过去依赖的过时ports
[-t] [-n] --clean-distfiles
遍历已安装的ports以获取distinfo文件列表,然后遍历 /usr/ports/distfiles 中的所有文件以确保它们仍然与已安装的ports相关联。如果没有,请删除过时的文件。使用 −t
选项,如果distfile被任何port使用,而不仅仅是已安装的ports,则视为有效。
[-t]
−y --clean-distfiles
执行与上述相同的操作,但会在不提示的情况下删除所有文件。
[--index|--index-only] [-n] --clean-packages
主动提出删除过时的包。如果没有可用的ports树,则需要使用 --index-only
选项。
[--index|--index-only]
-y --clean-packages
的操作与上述相同,但会删除所有过期的文件而不提示。
[-n|-y] [-v] --check-depends
交叉检查并更新所有ports的依赖关系信息
[-n|-y] [-v] --check-port-dbdir
检查 /var/db/ports 中的过时条目
-h|--help
显示帮助信息
--version
显示版本号
PACKAGES
变量指向的目录(默认为 /usr/ports/packages)将用于存储新的和备份的包。当为 -g
选项使用 make package
时,ports基础设施将把包存储在 ${PACKAGES}/All 中,即 PKGREPOSITORY
。使用 −b
选项时, portmaster
将其备份包存储在 ${PACKAGES}/portmaster-backup 中,以便您可以创建备份包和新安装port的包,即使它们的版本相同。
使用 --packages*
选项时,包文件将下载到 ${PACKAGES}/portmaster-download 。 portmaster
将尊重 PACKAGESITE
和 PACKAGEROOT
(默认为 http://ftp.freebsd.org
)变量。 portmaster
试图以与 pkg-add(8)
相同的方式使用这两个变量。
UPGRADE_TOOL
变量设置为“portmaster”,UPGRADE_PORT
和 UPGRADE_PORT_VER
变量设置为要替换的现有包的完整包名称字符串和版本(如果有的话)。
使用 --index-only
选项时, PACKAGES
变量必须设置为超级用户具有写入权限的目录。其他有用的变量包括:
环境变量 | 默认值 |
---|---|
PORTSDIR | /usr/ports |
MASTER_SITE_INDEX | http://www.FreeBSD.org/ports/ |
FETCHINIDEX | fetch -am -o |
INDEXDIR | $PORTSDIR 或 $TMPDIR(对于 --index-only ) |
INDEXFILE | 根据FreeBSD版本自动 |
如果您在包构建中使用非标准 OPTIONS
设置,并希望在没有ports树的情况下使用 --index-only
选项,则必须生成自己的 INDEX
文件,以便依赖关系匹配。
如果你想在每个port的基础上自定义你的构建环境,你可能想看看 /usr/ports/ports-mgmt/portconf 。
要记录 portmaster
采取的操作以及日期/时间戳,您可以在rc文件中使用要登录的文件的完整路径定义 PM_LOG
。如果使用 sudo(8)
运行 portmaster
(见下文),则应确保该文件可由无特权用户写入。
默认情况下,portmaster
在更新期间运行 pkg-delete(8)
之前,会创建已安装ports的备份包。如果该包创建失败,则将其视为严重错误,并提示用户。但是,对于 portmaster
的脚本使用,这可能是一个问题。在用户绝对确定缺少备份包不应该是致命错误的情况下,可以将 PM_IGNORE_FAILED_BACKUP_PACKAGE
定义为rc文件中的任何值。
对于那些希望确保特定port始终编译而不是从包中安装的人来说,可以在 make(1)
环境中定义 PT_NO_INSTALL_PACKAGE
变量,如果使用 /usr/ports/ports-mgmt/portconf ,则可以在 /usr/local/etc/ports.conf 中定义,或者在 /etc/make.conf 中定义。此设置与 -PP/--packages-only
选项不兼容。
/usr/local/etc/portmaster.rc
$HOME/.portmasterrc
可选的系统和用户配置文件。可以在这些文件中指定脚本的 getopts
例程中设置的变量,以启用这些选项。这些文件将由父 portmaster
进程读取,其中的所有变量都将被导出。如果 portmaster.rc 文件与 portmaster
脚本本身放置在同一目录中,则将按上述方式读取它。
如果已安装的ports存在此文件,则会发生以下情况:
无论出于何种目的,该port都将被忽略。
这包括依赖关系更新,即使 /usr/ports 中没有该port的目录,并且 /usr/ports/MOVED 中也没有该port条目。如果使用 -v
选项,则会提到port被忽略的事实。
如果使用 −L
选项,并且存在新版本,则会提到 +IGNOREME 文件的存在。
如果您定期更新port,或者正在使用 -a
选项,系统会询问您是否仍要更新port。
向包含 −R
选项的后续 -a
、 -f
或 -r
运行指示port已经重建,因此如果它是最新的,可以安全地忽略它。
如果使用了 -H
选项,但安装或升级不成功,则构建和安装的结果将保存在此文件中。在您的环境中适当替换 TMPDIR
的值。
成功时,portmaster
实用程序退出 0
,如果发生错误,则退出 >0
。
ports基础设施对作为无特权用户执行各种操作的支持有限。它通过定义SU_CMD来实现这一点,SU_CMD通常是 su(1)
。为了支持作为无特权用户对ports进行完全管理,仅在必要时升级为“root”权限,portmaster
可以使用 sudo(1)
来处理升级的权限。要实现这一点,您必须配置以下目录,以便无特权用户可以访问它们:
WRKDIRPREFIX —— 这通常设置为 /usr/ports/category/port/work
但是,建议您在ports树之外配置另一个目录,供无特权用户访问,并将此变量分配给 /etc/make.conf 中的该值。
DISTDIR —— 通常设置为 /usr/ports/distfiles
可以安全地设置此目录供无特权用户访问,也可以如上所述指定新目录。
TMPDIR —— 通常为 /tmp
但如果需要,也可以设置为shell环境中的另一个目录。
进一步假设以下目录将由root拥有:
/var/db/pkg
/var/db/ports
LOCALBASE —— 通常为 /usr/local
PACKAGES —— 通常为 /usr/ports/packages
PKGREPOSITORY —— 通常为 ${PACKAGES}/All
然后,您需要安装并配置 sudo(1)
。这可以通过 /usr/ports/security/sudo 轻松完成。然后,您需要在 /usr/local/etc/portmaster.rc 文件或 $HOME/.portmasterrc 文件中定义 PM_SU_CMD
。例如:
xxxxxxxxxx
PM_SU_CMD=/usr/local/bin/sudo
您也可以选择定义 PM_SU_VERBOSE
选项,以便在每次 portmaster
使用 PM_SU_CMD
时通知您。如果您正在尝试使用 sudo(1)
以外的工具来处理权限升级,这尤其有用,尽管目前 sudo(1)
是唯一受支持的选项。
请注意:您无法使用此方法升级 sudo(1)
port本身。
以下是 portmaster
命令的典型用法示例:
编译和安装一个尚未安装的port
xxxxxxxxxx
portmaster foo/fooport
portmaster foo/fooport@flavor
升级一个port
xxxxxxxxxx
portmaster fooport-1.23
portmaster fooport
postmaster foo/fooport
postmaster foo/fooport@flaver
如果可用,请使用软件包
xxxxxxxxxx
portmaster --packages fooport-1.23
升级多个ports
xxxxxxxxxx
portmaster fooport-1.23 barport baz/blahport
在本地构建一个port,但使用包来构建依赖关系,然后在完成时删除构建依赖关系:
xxxxxxxxxx
portmaster --packages-build --delete-build-only fooport-1.23
仅使用本地可用的软件包更新系统:
xxxxxxxxxx
portmaster -PP --local-packagedir=<path> -a
升级所有需要升级的ports
xxxxxxxxxx
portmaster -a
更新所有需要更新的ports,并在更新完成后删除过时的distfiles:
xxxxxxxxxx
portmaster -a
xxxxxxxxxx
portmaster --clean-distfiles
更复杂的任务(请参阅上面这些选项的详细信息)
xxxxxxxxxx
portmaster -r fooport-1.23
portmaster -r fooport-1.23 -r barport-2.34
portmaster -o emulators/linux_base-fc4 linux_base-8-8.0_15
portmaster -a -x gstreamer -x linux
仅打印有可用更新的ports。这可以用作shell中的别名。一定要适当地固定缠绕线。
xxxxxxxxxx
portmaster -L | \
egrep -B1 ’(ew|ort) version|Aborting|installed|dependencies| \
IGNORE|marked|Reason:|MOVED|deleted|exist|update’ | grep -v ’ˆ--’
使用 portmaster
完全重新安装所有ports
xxxxxxxxxx
portmaster --list-origins > ˜/installed-port-list
更新ports树
xxxxxxxxxx
portmaster -ty --clean-distfiles
xxxxxxxxxx
portmaster -Faf
xxxxxxxxxx
pkg delete -afy
xxxxxxxxxx
rm -rf /usr/local/lib/compat/pkg
备份 /usr/local 中要保存的任何文件,例如 /usr/local/etc 中的配置文件
手动检查 /usr/local 和 /var/db/pkg ,确保它们真的是空的
安装 ports-mgmt/pkg
,然后安装ports-mgmt/portmaster
。从已安装ports列表中删除这两个ports。
xxxxxxxxxx
portmaster --no-confirm ‘cat ˜/installed-port-list‘
完成后,您可能希望再次运行 --clean-distfiles[-y]
。您可能还想考虑在安装新port时使用 --force-config
选项。
或者,您可以使用 portmaster −a −f −D
对ports进行“就地”更新。如果该进程因任何原因中断,您可以使用 portmaster −a −f −D −R
来避免重建在以前运行中已经重建的ports。但是,首选第一种方法(删除所有内容并重新安装)。
make(1), su(1), pkg(7), ports(7), ldconfig(8), pkg(8), pkg-add(8), pkg-delete(8), sudo(8)
本手册页由Doug Barton撰写 dougb@FreeBSD.org。